iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Modern Web

Google Apps Script 整合運用系列 第 10

全域變數&權限

  • 分享至 

  • xImage
  •  

全域變數

  1. 指令碼:prog_global.gs
  2. 函式:get_global()
  3. 將全局的變數,利用指令碼屬性儲存,但它無法儲存物件,故我們將這個物件變數轉成JSON,要撈出時再轉成物件
  4. 物件變 JSON:
JSON.stringify()
  1. JSON 變物件:
JSON.parse()
  1. 常用指令
// 指令碼屬性:設定
SCRIPT_PROP.setProperty(屬性,值);

// 指令碼屬性:取值
SCRIPT_PROP.getProperty(屬性);

// Session: 取得當前使用者email(只限部署人)
Session.getActiveUser().getEmail();

// 網頁應用程式網址
ScriptApp.getService().getUrl()
  1. 目前需要用到的「全域變數」:isAdmin、url、webTitle
    isAdmin、url是動態資料,不需儲存
    webTitle 則是可以事先儲存,這裡先用變數,後面再來做一個界面用表單操作
  2. 宣告
    前台的樣版語法,可以直接調後台的函式,故 global是不用傳值進入 render(),也可以直接調用

//------------------------------------- 3. 全域變數
var global = get_global();
//------------------------------------- 4. 選單
var menu = render('menu', {});
  1. 取得全域變數
/*=====================================
  取得全域變數
=====================================*/
function get_global() {
  // 從指令碼屬性 取得 global
  global = SCRIPT_PROP.getProperty('global') ? JSON.parse(SCRIPT_PROP.getProperty('global')) : {};

  // 管理員權限
  global['isAdmin'] = SCRIPT_PROP.getProperty('adminEmail') === Session.getActiveUser().getEmail() ? true : false;

  // 網頁應用程式網址
  global['url'] = ScriptApp.getService().getUrl();

  return global;
}

  1. 設定全域變數

/*=====================================
 安裝程式
=====================================*/
function setup() {
  //管理員email  
  SCRIPT_PROP.setProperty("adminEmail", Session.getActiveUser().getEmail());

  global = {
    webTitle : '育將電腦工作室'
  }  
  SCRIPT_PROP.setProperty("global", JSON.stringify(global));
  global = get_global();
} 
  1. 確認 global 沒問題後,請更改樣版語法 menu.html
<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container-fluid">
    <a class="navbar-brand" href="<?= global.url ?>"><?= global.webTitle ?></a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <li class="nav-item">
          <a class="nav-link active" aria-current="page" href="<?= global.url ?>">首頁</a>
        </li>
        <? if(global.isAdmin){ ?>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
              管理員
            </a>
            <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
              <li><a class="dropdown-item" href="<?= global.url ?>?op=custom">客戶管理</a></li>
              <li><hr class="dropdown-divider"></li>
            </ul>
          </li>
        <? } ?>

      </ul>
    </div>
  </div>
</nav>
  1. 調整樣版 將index.html 改名 tmp.html
<html>
  <head>
    <meta charset="utf-8">
    <base target="_top">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm" crossorigin="anonymous"></script>

    <!-- bootstrap icon -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">

    <!-- jquery -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>

  </head>
  <body>
    <?!= menu ?>
    
    <div class="container">
      
      <!-- 資料處理時畫面 -->
      <div class="d-none my-5" id="show">
        <span>資料處理中....<img src="https://i.imgur.com/pm9SKUg.gif"></span>
      </div>
      
      <!-- 主畫面 -->
      <div id='main-content'>
        <?!= content ?>
      </div>

    </div>
    
  </body>
</html>
  1. index(e)
/*=====================================
  首頁
=====================================*/
function index(e) {
  let title = '首頁';
  let content = '';
  content = `<h2 class='mt-3'>${title}</h2>`;
  return render('tmp', {content: content}, title);  
}
  1. custom(e)

/*========================================
  客戶資料 查詢
=========================================*/
function custom(e){
  let title = '客戶管理';
  let content = '';
  content = `<h2 class='mt-3'>${title}</h2>`;
  return render('tmp', {content: content}, title); 
}

權限

  1. 種類:管理員、訪客
  2. 在「建立路由與請求」單元,我們知道若要執行「客戶管理」,須透過「路由」Route.path("custom", custom),所以只將這個路由,放在 isAdmin 條件下,這樣訪客就沒有路由,也無法執行

  // ----------------------------------- 管理員 路由
  if(global.isAdmin){
    Route.path("custom", custom);
  }
  // ----------------------------------- 管理員 路由 END

上一篇
建立路由與請求
下一篇
Bootstrap Table(一)
系列文
Google Apps Script 整合運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言